package com.qcu.config;




import com.qcu.store.MongoChatMemoryStore;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.List;

/**
 * @Name: MyComputer
 * @ClassName ShuGoAgentConfig
 * @Description:
 * @date 2025/4/24 18:24
 */
@Configuration
public class ShuGoAgentConfig {

//    @Resource
//    private EmbeddingStore embeddingStore;
//
//    @Resource
//    private EmbeddingModel embeddingModel;

    @Resource
    private MongoChatMemoryStore mongoChatMemoryStore;
    @Bean
    ChatMemoryProvider chatMemoryProviderShuGo() {
        return memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId)
                .maxMessages(20)
                .chatMemoryStore(mongoChatMemoryStore)
                .build();
    }

    /**
     * 创建并配置一个ContentRetriever实例
     * 该方法加载医疗相关的文档，将其转换为嵌入向量，并存储在内存中，以便快速检索
     *
     * @return ContentRetriever 一个用于检索内容的ContentRetriever实例
     */
    @Bean
    ContentRetriever contentRetrieverShuGo() {
        // 加载医院信息文档
        Document document1 = FileSystemDocumentLoader.loadDocument("E:\\knowledge\\医院信息.md");
        // 加载科室信息文档
        Document document2 = FileSystemDocumentLoader.loadDocument("E:\\knowledge\\科室信息.md");
        Document document3 = FileSystemDocumentLoader.loadDocument("E:\\knowledge\\神经内科.md");
        // 将加载的文档存储在列表中
        List<Document> documents = Arrays.asList(document1, document2,document3);
        // 创建一个内存中的嵌入存储器，用于存储文本片段的嵌入向量
        InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
        // 将文档中的文本转换为嵌入向量并存储到嵌入存储器中
        EmbeddingStoreIngestor.ingest(documents, embeddingStore);
        // 根据嵌入存储器创建并返回一个ContentRetriever实例
        return EmbeddingStoreContentRetriever.from(embeddingStore);
    }

//    @Bean
//    ContentRetriever contentRetrieverShuGoPincone() {
//// 创建一个 EmbeddingStoreContentRetriever 对象，用于从嵌入存储中检索内容
//        return EmbeddingStoreContentRetriever
//                .builder()
//// 设置用于生成嵌入向量的嵌入模型
//                .embeddingModel(embeddingModel)
//// 指定要使用的嵌入存储
//                .embeddingStore(embeddingStore)
//// 设置最大检索结果数量，这里表示最多返回 1 条匹配结果
//                .maxResults(1)
//// 设置最小得分阈值，只有得分大于等于 0.8 的结果才会被返回
//                .minScore(0.8)
//// 构建最终的 EmbeddingStoreContentRetriever 实例
//                .build();
//    }
}
